package com.shihb.chapter02function

/**
 * 偏函数的介绍问题引出：
 * 将List(1,2,3,4,"Hi")所有数据*2
 */
object Demo07PartialFunction {
  // 解决方案1,filter map
  def plan1: Unit = {
    val list = List(1, 2, 3, 4, "Hi")
    val ints: List[Int] = list.filter(o1 => o1.isInstanceOf[Int]).map(o1 => o1.asInstanceOf[Int]).map(o1 => 2 * o1)
    println(ints)
    //缺点麻烦
  }

  def plan2: Unit = {
    val list = List(1, 2, 3, 4, "Hi")
    val list1: List[Any] = list.map(o1 => {
      o1 match {
        case a: Int => a * 2
        case _ =>
      }
    })
    println(list1)
    //List(2, 4, 6, 8, ()) 结果有点瑕疵也不是能完美解决
  }

  // 使用偏函数求解
  def solve: Unit = {
    /*
      定义一个偏函数PartialFunction时一个特质
      PartialFunction[Any,Int] PartialFunction[In,Out]输入Any,输出Int
      isDefinedAt返回boolean,为真运行apply,为假不执行apply
     */
    val partialFun: PartialFunction[Any, Int] = new PartialFunction[Any, Int] {
      override def isDefinedAt(x: Any): Boolean = x.isInstanceOf[Int]

      override def apply(v1: Any): Int = v1.asInstanceOf[Int] * 2
    }
    // 如何使用，不能用map,要使用collect
    val list = List(1, 2, 3, 4, "Hi")
    println(list.collect(partialFun))

  }

  //偏函数的简化形式,都要实行isDefinedAt,apply两个方法，scala设计者就设计了简化写法
  def simplify: Unit = {
    //写法一:要注意这里时定义一个方法类型时PartialFunction[Any, Int],没简化是一个对象实例
    def f1:PartialFunction[Any, Int] ={
      case o: Int => o * 2
    }

    val list = List(1, 2, 3, 4, "Hi")
    println(list.collect(f1))
    // 第二种简写形式 collect后面时{}不是()
    println(list.collect{case o:Int =>o*2})
  }

  def main(args: Array[String]): Unit = {
    //    plan1
    //    plan2
    //      solve
    simplify
  }
}
